/**
 * Qilin-App的全局封装方法
 * 主要方便维护项目以及增加开发效率等
 * @author Qilin
 * @CreateDate 2025-01-20
 * @lastUpdateDate 2025-01-20
 */
import { uploadFile } from "@/api/index.js";
import { fileOptions } from "@/utils/setting.js";

/**
 * 将正则字符串转为正则对象的方法封装
 * 注：网页或h5可以直接eval函数或new Function使用，但是小程序中都不可用，故此封装此方法
 * 网页或h5使用方法如下示例：
 * @function1 new Function("return " + regStr)();
 * @function2 eval(regStr);
 */
export function regStr2RegExp(regStr){
	let regex = regStr.match(/^\/([\S\s]+)\/([gim]{0,3})$/);
	regex = regex || [,regex,""];
	regex = new RegExp(regex[1],regex[2]);
	return regex;
};

/**
 * 获取当前页面接收的参数对象
 * 注：页面接收的参数也可以使用onLoad页面生命周期函数来获取
 * 例：import { onLoad, onShow } from "@dcloudio/uni-app";
 * @returns 参数对象：其中options中就是接收的传参信息
 */
export function getCurrentPageParams(){
	const pages = getCurrentPages();
	const currentPage = pages[pages.length - 1];
	return currentPage;
};

/**
 * 提示相关信息并返回上一层页面（针对不同端）
 * 注意：若是android系统，则会返回到上一层并且刷新页面，且不会触发onBackPress页面生命函数
 * @params String 提示信息
 * @params Number 停在当前页面的毫秒数--仅针对于小程序端
 * @returns 无返回值
 */
export function QilinShowToast(title,time = 1000){
	uni.showToast({
		title,
		icon:"none",
		success:()=>{
			// #ifdef H5
			uni.navigateBack({
				delta:1
			});
			// #endif
			// #ifdef MP-WEIXIN
			setTimeout(()=>{
				uni.navigateBack({
					delta:1
				});
			},time);
			// #endif
		}
	});
};

/**
 * 获取H5端地址栏url的对应参数名的参数值
 * @params String keyName 参数名
 * @params String url 指定url，不传默认为当前url
 * @returns 参数值
 */
export function getUrlParamsValue(keyName,url){
	if(!keyName || typeof keyName !== "string"){
		throw new TypeError("第一个参数必传且须为字符串");
	};
	let searchUrl=window.location.search.slice(1);
	if(url){
		searchUrl=url.slice(url.indexOf("?")+1);
	};
	let reg=new RegExp("(^|&)"+keyName+"=([^&]*)(&|$)");
	if(!searchUrl){
		let arr=window.location.hash.split("?");
		if(url){
			arr=url.split("?");
		};
		if(arr.length === 2){
			searchUrl=arr[1];
		};
	};
	let result=searchUrl.match(reg);
	if(result){
		return decodeURIComponent(result[2]);
	}else{
		return null;
	};
};

/**
 * 附件上传统一封装方法--针对于QilinUploadImage组件的附件上传
 * @param fileList  需要上传的文件列表
 * @param file  需要上传的文件
 * @returns 无返回值
 */
export const getUploadFileData = (fileList,file)=>{
    // console.log(fileList,"=====");
    uploadFile({
    	filePath:file.url
    }).then((res)=>{
    	const result=JSON.parse(res);
    	if(result.code === 200){
    		// console.log(result);
    		fileList.push(result.data);
    	}else{
    		uni.showToast({
    			title:result.msg || "系统错误",
    			icon:"error"
    		});
    	};
    });
};


// 封装uni.showModal方法
export function showModal(options){
	uni.showModal({
		title:options.title || "提示",
		showCancel:options.showCancel || false,
		...options
	});
};

// 获取格式化时间
export function getFormatDate(date,type){
	if(!date || new Date(date) == "Invalid Date"){
		date=new Date();
	}else{
		date=new Date(date);
	};
	let MyDate=date;
	let Year=MyDate.getFullYear(); //获取年
	let Month=(MyDate.getMonth()+1)<10?"0"+(MyDate.getMonth()+1):(MyDate.getMonth()+1); //获取月
	let nativeMonth=MyDate.getMonth()+1; //获取原生月
	let Day=MyDate.getDate()<10?"0"+MyDate.getDate():MyDate.getDate(); //获取日
	let nativeDay=MyDate.getDate(); //获取原生天
	let Hour=MyDate.getHours()<10?"0"+MyDate.getHours():MyDate.getHours(); //获取小时
	let Minute=MyDate.getMinutes()<10?"0"+MyDate.getMinutes():MyDate.getMinutes(); //获取分钟
	let Second=MyDate.getSeconds()<10?"0"+MyDate.getSeconds():MyDate.getSeconds(); //获取秒钟
	let weekDay=MyDate.getDay(); //获取星期几
	let formatDate=Year+"-"+Month+"-"+Day+" "+Hour+":"+Minute+":"+Second;
	let weekArr=["星期天","星期一","星期二","星期三","星期四","星期五","星期六"];
	switch (type) {
		case "yyyy" : formatDate=Year+"" ; break ;
		case "yyyy-MM" : formatDate=Year+"-"+Month ; break;
		case "yyyy-MM-dd" : formatDate=Year+"-"+Month+"-"+Day ; break;
		case "yyyy-MM-dd hh:mm" : formatDate=Year+"-"+Month+"-"+Day+" "+Hour+":"+Minute ; break;
		case "yyyy-MM-dd hh:mm:ss" : formatDate=Year+"-"+Month+"-"+Day+" "+Hour+":"+Minute+":"+Second ; break;
		case "M" : formatDate=nativeMonth+"" ; break;
		case "MM" : formatDate=Month+"" ; break;
		case "MM-dd" : formatDate=Month+"-"+Day ; break;
		case "MM-dd hh:mm" : formatDate=Month+"-"+Day+" "+Hour+":"+Minute ; break;
		case "MM-dd hh:mm:ss" : formatDate=Month+"-"+Day+" "+Hour+":"+Minute+":"+Second ; break;
		case "d" : formatDate=nativeDay+"" ; break;
		case "dd" : formatDate=Day+"" ; break;
		case "dd hh:mm" : formatDate=Day+" "+Hour+":"+Minute ; break;
		case "dd hh:mm:ss" : formatDate=Day+" "+Hour+":"+Minute+":"+Second ; break;
		case "hh:mm:ss" : formatDate=Hour+":"+Minute+":"+Second ; break;
		case "hh:mm" : formatDate=Hour+":"+Minute ; break;
		case "chinese" : formatDate=Year+"年"+Month+"月"+Day+"日" ; break;
		case "chinese hh:mm" : formatDate=Year+"年"+Month+"月"+Day+"日"+" "+Hour+":"+Minute ; break;
		case "chinese hh:mm:ss" : formatDate=Year+"年"+Month+"月"+Day+"日"+" "+Hour+":"+Minute+":"+Second ; break;
		case "week" : formatDate=weekArr[weekDay] ; break;
	};
	return formatDate;
};

// 数组去重的方法
export function uniqueArray(arr,name){
	let obj={};
	let arr1=[];
	if(name){ //针对对象数组
		for(let i=0;i<arr.length;i++){
			if(!obj[arr[i][name]]){ //判断obj对象中有无该属性，无则将其添加为属性
				obj[arr[i][name]]=true;
				arr1.push(arr[i]); //存入临时数组
			};
		};
	}else{
		for(let i=0;i<arr.length;i++){
			if(!obj[arr[i]]){ //判断obj对象中有无该属性，无则将其添加为属性
				obj[arr[i]]=true;
				arr1.push(arr[i]); //存入临时数组
			};
		};
	};
	return arr1;
};

// 判断对象中数组最小的一项的方法--返回索引
export function findMinValueItem(arr,key){
	let index=0;
	let minValueItem=arr[index]; //假设第一项值最小
	for(let i=0;i<arr.length;i++){
		if(arr[i][key] < minValueItem[key]){
			minValueItem=arr[i];
			index=i;
		};
	};
	return index;
};

// 判断小时前是否需补零方法
export function supplementZero(time){
	if(!time) return null;
	const arr=time.split(":");
	if(Number(arr[0]) < 10 ){
		arr[0]=0+arr[0];
	};
	return arr[0]+":"+arr[1];
};

// 判断日期前是否需补零方法
export function supplementZeroDate(date,type="-"){
	if(!date) return null;
	let arr=date.split(type);
	arr=arr.map((item)=>{
		if(Number(item)<10){
			item=0+item;
		};
		return item;
	});
	return arr.join(type);
};